package com.hk.commons.poi.excel.metadata;

import com.hk.commons.util.NumberUtils;
import com.hk.commons.util.ObjectUtils;
import com.hk.commons.util.date.DateTimeUtils;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

/**
 * Excel格式
 *
 * @author kevin
 */
@Getter
@RequiredArgsConstructor
public enum DataFormat {

    /**
     * 文本格式
     */
    TEXT_FORMAT {
        @Override
        public String pattern() {
            return "GENERAL";
        }

        @Override
        public String format(Object value) {
            return ObjectUtils.toString(value);
        }
    },

    /**
     * 日期格式 : yyyy
     */
    DATE_FORMAT_YEAR {
        @Override
        public String pattern() {
            return DateTimeUtils.YYYY;
        }
    },

    /**
     * 日期格式 : yyyy-MM
     */
    DATE_FORMAT_YEAR_MONTH {
        @Override
        public String pattern() {
            return DateTimeUtils.YYYY_MM;
        }
    },

    /**
     * 日期格式: yyyy-MM-dd
     */
    DATE_FORMAT {
        @Override
        public String pattern() {
            return DateTimeUtils.YYYY_MM_DD;
        }
    },

    /**
     * 日期格式: yyyy年MM月dd日
     */
    DATE_FORMAT_CN {
        @Override
        public String pattern() {
            return DateTimeUtils.YYYY_MM_DD_CN;
        }
    },

    /**
     * 日期格式：yyyy/MM/dd
     */
    DATE_FORMAT_EN {
        @Override
        public String pattern() {
            return DateTimeUtils.YYYY_MM_DD_EN;
        }
    },

    /**
     * 日期格式:yyyy/MM/dd HH:mm:ss
     */
    DATETIME_FORMAT_EN {
        @Override
        public String pattern() {
            return DateTimeUtils.YYYY_MM_DD_HH_MM_SS_EN;
        }
    },

    /**
     * 日期时间格式:yyyy-MM-dd HH:mm:ss
     */
    DATETIME_FORMAT {
        @Override
        public String pattern() {
            return DateTimeUtils.YYYY_MM_DD_HH_MM_SS;
        }
    },

    /**
     * 时间格式：HH:mm
     */
    TIME_FORMAT_1 {
        @Override
        public String pattern() {
            return DateTimeUtils.HH_MM;
        }
    },

    /**
     * 时间格式：HH:mm:ss
     */
    TIME_FORMAT_2 {
        @Override
        public String pattern() {
            return DateTimeUtils.HH_MM_SS;
        }
    },

    /**
     * 整数格式
     */
    INTEGER_FORMAT {
        @Override
        public String format(Object value) {
            return NumberUtils.formatDecimal(value, pattern());
        }

        @Override
        public String pattern() {
            return "#";
        }
    },

    /**
     * 小数格式, 精确到小数点后一位
     */
    DECIMAL_FORMAT_1 {
        @Override
        public String format(Object value) {
            return NumberUtils.formatDecimal(value, pattern());
        }

        @Override
        public String pattern() {
            return "#.#";
        }
    },

    /**
     * 小数格式, 精确到小数点后两位
     */
    DECIMAL_FORMAT_2 {
        @Override
        public String format(Object value) {
            return NumberUtils.formatDecimal(value, pattern());
        }

        @Override
        public String pattern() {
            return "#.##";
        }
    },

    /**
     * 小数格式, 精确到小数点三位
     */
    DECIMAL_FORMAT_3 {
        @Override
        public String format(Object value) {
            return NumberUtils.formatDecimal(value, pattern());
        }

        @Override
        public String pattern() {
            return "#.###";
        }
    },

    /**
     * 百分比格式
     */
    PERCENT_FORMAT {
        @Override
        public String format(Object value) {
            return NumberUtils.formatPercent(value, 0);
        }

        @Override
        public String pattern() {
            return "0%";
        }
    },

    /**
     * 百分比格式, 精确到小数点后一位
     */
    PERCENT_FORMAT_1 {
        @Override
        public String format(Object value) {
            return NumberUtils.formatPercent(value, 1);
        }

        @Override
        public String pattern() {
            return "0.0%";
        }
    },

    /**
     * 百分比格式, 精确到小数点后两位
     */
    PERCENT_FORMAT_2 {
        @Override
        public String format(Object value) {
            return NumberUtils.formatPercent(value, 2);
        }

        @Override
        public String pattern() {
            return "0.00%";
        }
    },

    /**
     * 百分比格式, 精确到小数点后三位
     */
    PERCENT_FORMAT_3 {
        @Override
        public String format(Object value) {
            return NumberUtils.formatPercent(value, 3);
        }

        @Override
        public String pattern() {
            return "0.000%";
        }
    },

    /**
     * 货币格式
     */
    CURRENCY_FORMAT {
        @Override
        public String format(Object value) {
            return NumberUtils.formatDecimal(value, pattern());
        }

        @Override
        public String pattern() {
            return "￥#,##0;￥-#,##0";
        }
    },

    /**
     * 货币格式, 精确到小数点后一位
     */
    CURRENCY_FORMAT_1 {
        @Override
        public String format(Object value) {
            return NumberUtils.formatDecimal(value, pattern());
        }

        @Override
        public String pattern() {
            return "￥#,##0.0;￥-#,##0.0";
        }
    },

    /**
     * 货币格式, 精确到小数点后两位
     */
    CURRENCY_FORMAT_2 {
        @Override
        public String format(Object value) {
            return NumberUtils.formatDecimal(value, pattern());
        }

        @Override
        public String pattern() {
            return "￥#,##0.00;￥-#,##0.00";
        }
    },

    /**
     * 货币格式, 精确到小数点后三位
     */
    CURRENCY_FORMAT_3 {
        @Override
        public String format(Object value) {
            return NumberUtils.formatDecimal(value, pattern());
        }

        @Override
        public String pattern() {
            return "￥#,##0.000;￥-#,##0.000";
        }
    };

    public abstract String pattern();

    public String format(Object value) {
        return DateTimeUtils.objectToString(value, pattern());
    }

}
